<?php

namespace app\v6\controller;

use app\service\JwtService;
use think\Controller;
use think\facade\Config;
use think\facade\Cookie;
use think\facade\Lang;
use think\facade\Request;

class Language extends Controller
{
    /**
     * 检查JWT认证
     *
     * @return bool|array 成功返回用户信息，失败返回false
     */
    protected function checkJwt()
    {
        $token = JwtService::getTokenFromHeader();
        if (!$token) {
            return false;
        }

        return JwtService::verifyToken($token);
    }

    /**
     * 获取多语言版本号.
     *
     * @return \think\response\Json
     */
    public function getVersion()
    {
        // 获取当前语言
        $lang = Lang::range();

        // 全局统一的语言版本号，无需为每种语言单独设计
        // 当语言内容更新时可以增加版本号
        $version = '1.2.5';

        return json([
            'code' => 200,
            'msg' => 'success',
            'data' => [
                'version' => $version,
                'lang' => $lang,
            ],
        ]);
    }

    /**
     * 获取多语言内容.
     *
     * @return \think\response\Json
     */
    public function getContent()
    {
        // 获取当前语言
        $lang = Lang::range();

        // 直接从文件加载common.php的内容，而不是通过Lang类
        $langPath = app()->getAppPath().'lang/'.$lang.'/';
        $commonFile = $langPath.'common.php';

        // 检查common.php是否存在
        $langData = [];
        if (file_exists($commonFile)) {
            // 直接包含文件获取语言数组，不通过Lang类加载
            $langData = include $commonFile;
            if (!is_array($langData)) {
                $langData = [];
            }
        }

        // 使用与 getVersion 方法相同的版本号
        $version = '1.1.5';

        return json([
            'code' => 200,
            'msg' => 'success',
            'data' => [
                'content' => $langData,
                'version' => $version,  // 使用统一版本号
                'lang' => $lang,
            ],
        ]);
    }

    /**
     * 切换语言
     *
     * @return \think\response\Json
     */
    public function switchLang()
    {
        // 获取请求参数
        $lang = Request::param('lang');

        // 检查语言是否在允许的语言列表中
        $allowLangList = Config::get('app.lang_list');
        if (!in_array($lang, $allowLangList)) {
            return json([
                'code' => 400,
                'msg' => 'Language not supported',
                'data' => null,
            ]);
        }

        // 设置语言Cookie（中间件会在下次请求时自动加载对应语言包）
        Cookie::set('think_lang', $lang);

        // 立即设置当前请求的语言环境
        Lang::range($lang);

        // 立即加载对应语言包 - 支持模块化语言包
        $this->loadLanguageModules($lang, [], ['common']);

        return json([
            'code' => 200,
            'msg' => Lang::get('language_switched'),
            'data' => [
                'lang' => $lang,
            ],
        ]);
    }

    /**
     * 获取支持的语言列表.
     *
     * @return \think\response\Json
     */
    public function getLangList()
    {
        $allowLangList = Config::get('app.lang_list');
        $currentLang = Lang::range();

        // 中间件已经加载了当前语言包，无需重复加载

        $langNames = [
            'zh-cn' => Lang::get('chinese'),
            'en-us' => Lang::get('english'),
            'ja-jp' => Lang::get('japanese'),
            'be-by' => Lang::get('belarusian'),
        ];

        $langList = [];
        foreach ($allowLangList as $lang) {
            $langList[] = [
                'code' => $lang,
                'name' => $langNames[$lang] ?? $lang,
            ];
        }

        return json([
            'code' => 200,
            'msg' => 'success',
            'data' => [
                'list' => $langList,
                'current' => $currentLang,
            ],
        ]);
    }

    /**
     * 测试多语言功能
     * 用于验证当前语言环境下各种语言键的输出.
     *
     * @return \think\response\Json
     */
    public function testLang()
    {
        $currentLang = Lang::range();

        // 测试常用的语言键
        $testKeys = [
            'user_prefix',
            'welcome',
            'login',
            'language_switched',
            'chinese',
            'english',
            'japanese',
            'belarusian',
        ];

        $testResults = [];
        foreach ($testKeys as $key) {
            $testResults[$key] = Lang::get($key);
        }

        return json([
            'code' => 200,
            'msg' => 'Language test completed',
            'data' => [
                'current_lang' => $currentLang,
                'cookie_lang' => Cookie::get('think_lang'),
                'test_results' => $testResults,
                'timestamp' => date('Y-m-d H:i:s'),
            ],
        ]);
    }

    /**
     * 加载指定语言的模块文件.
     *
     * @param string $lang           语言代码
     * @param array  $excludeModules 要排除的模块列表（可选）
     * @param array  $includeModules 仅加载指定的模块列表（可选，优先级高于excludeModules）
     */
    private function loadLanguageModules($lang, $excludeModules = [], $includeModules = [])
    {
        $langPath = app()->getAppPath().'lang/'.$lang.'/';

        // 检查语言目录是否存在
        if (!is_dir($langPath)) {
            // Log::warning("Language directory not found: {$langPath}");
            return;
        }

        // 动态扫描所有 .php 语言文件
        $langFiles = glob($langPath.'*.php');

        if (empty($langFiles)) {
            // Log::warning("No language files found in directory: {$langPath}");
            return;
        }

        // 获取所有可用的模块
        $availableModules = [];
        foreach ($langFiles as $langFile) {
            $module = basename($langFile, '.php');
            $availableModules[] = $module;
        }

        // 如果指定了仅加载的模块列表，则只加载这些模块
        if (!empty($includeModules)) {
            $modulesToLoad = array_intersect($includeModules, $availableModules);
        } else {
            // 否则加载所有模块，但排除指定的模块
            $modulesToLoad = array_diff($availableModules, $excludeModules);
        }

        // 定义加载优先级（common 最先加载，如果在加载列表中）
        $priorityModules = [];
        $otherModules = [];

        foreach ($modulesToLoad as $module) {
            if ($module === 'common') {
                $priorityModules[] = $module;
            } else {
                $otherModules[] = $module;
            }
        }

        // 按字母顺序排序其他模块
        sort($otherModules);

        // 合并所有模块（common 优先）
        $allModules = array_merge($priorityModules, $otherModules);

        // 加载所有模块
        foreach ($allModules as $module) {
            $langFile = $langPath.$module.'.php';
            if (file_exists($langFile)) {
                try {
                    // 加载语言包文件
                    Lang::load($langFile);

                    // 记录日志（可选，用于调试）
                    // Log::info("Loaded language module: {$lang}/{$module}.php");
                } catch (\Exception $e) {
                    // 记录加载失败的日志
                    // Log::error("Failed to load language module: {$lang}/{$module}.php - " . $e->getMessage());
                }
            }
        }
    }
}
